package inmobiliaria.frsf.util;

import java.text.DateFormat;
import java.text.ParseException;
import java.text.SimpleDateFormat;
import java.util.Calendar;
import java.util.Date;
import java.util.LinkedHashMap;
import java.util.Locale;
import java.util.Map;

/**
 * Esta clase tiene la responsabilidad de realizar diversas funciones destinadas
 * a facilitar el manejo de objetos de la clase Date.
 * 
 */
public class DateUtils {

	/**
	 * Constante utilizada para representar el formato de fecha dd/MM/yyyy
	 */
	public static final String FORMAT_DDMMYYYY = "dd/MM/yyyy";

	/**
	 * Constante utilizada para representar el formato de fecha yyyy-MM-dd
	 */
	public static final String FORMAT_YYYY_MM_DD = "yyyy-MM-dd";

	/**
	 * Constante utilizada para representar el formato de fecha yyyyMMdd
	 */
	public static final String FORMAT_YYYYMMDD = "yyyyMMdd";

	/**
	 * Constante utilizada para representar el formato de fecha yyyyMMddHHmmss
	 */
	public static final String FORMAT_YYYYMMDDHHMMSS = "yyyyMMddHHmmss";

	/**
	 * Obtiene el String representativo de la fecha con el formato especificado.
	 * 
	 * @param fecha
	 *            Fecha
	 * @param pattern
	 *            Patr�n utilizado para el formato de la fecha
	 * 
	 * @return String representativo de la fecha con el formato especificado.
	 */
	public static String format(Date fecha, String pattern) {
		DateFormat sdf = new SimpleDateFormat(pattern);
		return sdf.format(fecha);
	}

	/**
	 * Obtiene el String representativo de la fecha con el formato especificado.
	 * 
	 * @param fecha
	 *            Fecha
	 * @param pattern
	 *            Patr�n utilizado para el formato de la fecha
	 * 
	 * @return String representativo de la fecha con el formato especificado.
	 * @throws ParseException
	 */
	public static Date parse(String fecha, String pattern)
			throws ParseException {
		DateFormat sdf = new SimpleDateFormat(pattern);
		sdf.setLenient(false);
		return sdf.parse(fecha);
	}

	public static Boolean actualOMayor(String fechax) {

		String[] aux = new String[3];
		aux = fechax.split("/");
		Calendar hoy = Calendar.getInstance();
		System.out.println("Fecha actual " + hoy.get(Calendar.DAY_OF_MONTH)
				+ " " + (hoy.get(Calendar.MONTH) + 1) + " "
				+ hoy.get(Calendar.YEAR));

		if (Integer.parseInt(aux[0]) < hoy.get(Calendar.DAY_OF_MONTH)
				&& Integer.parseInt(aux[1]) < hoy.get(Calendar.MONTH) + 1
				&& Integer.parseInt(aux[2]) < hoy.get(Calendar.YEAR))
			return false;

		return true;

	}

	public static Boolean ValidarOrdenFechas(String fechaDesde,
			String fechaHasta) {

		String[] fecha1 = new String[3];
		fecha1 = fechaDesde.split("/");
		String[] fecha2 = new String[3];
		fecha2 = fechaHasta.split("/");

		if (Integer.parseInt(fecha1[2]) > Integer.parseInt(fecha2[2])
				|| Integer.parseInt(fecha1[2]) == Integer.parseInt(fecha2[2])
				&& Integer.parseInt(fecha1[1]) > Integer.parseInt(fecha2[1])
				|| Integer.parseInt(fecha1[2]) == Integer.parseInt(fecha2[2])
				&& Integer.parseInt(fecha1[1]) == Integer.parseInt(fecha2[1])
				&& Integer.parseInt(fecha1[0]) > Integer.parseInt(fecha2[0])) {

			return false;

		}
		return true;
	}

	/**
	 * Este metodo convierte una fecha desde un String a un tipo DATE
	 * 
	 * @param unaFecha
	 *            contenida en un String
	 * @return el tipo DATE correspondiente
	 */
	@SuppressWarnings("deprecation")
	public static Date convertirFecha(String unaFecha) {

		Date fecha = new Date();
		int dia;
		int mes;
		int anio;
		String[] aux = new String[3];
		aux = unaFecha.split("/");
		dia = Integer.parseInt(aux[0]);
		mes = Integer.parseInt(aux[1]);
		anio = Integer.parseInt(aux[2]);
		fecha.setDate(dia);
		fecha.setMonth(mes);
		fecha.setYear(anio);
		return fecha;
	}

	/**
	 * Obtiene el nombre del mes a partir de la fecha
	 * 
	 * @param fecha
	 *            Fecha pasada por par�metro
	 * 
	 * @return Nombre del mes
	 */
	public static String getMesEnLetras(Calendar fecha) {
		String mes = "";
		switch (fecha.get(Calendar.MONTH)) {
		case 0:
			mes = "Enero";
			break;
		case 1:
			mes = "Febrero";
			break;
		case 2:
			mes = "Marzo";
			break;
		case 3:
			mes = "Abril";
			break;
		case 4:
			mes = "Mayo";
			break;
		case 5:
			mes = "Junio";
			break;
		case 6:
			mes = "Julio";
			break;
		case 7:
			mes = "Agosto";
			break;
		case 8:
			mes = "Septiembre";
			break;
		case 9:
			mes = "Octubre";
			break;
		case 10:
			mes = "Noviembre";
			break;
		case 11:
			mes = "Diciembre";
			break;

		default:
			break;
		}
		return mes;
	}

	/**
	 * Retorna la fecha pasada por par�metros en letras a ser interpretada por
	 * el reporte de servicios de liquidaci�n
	 * 
	 * @param fecha
	 *            Fecha
	 * 
	 * @return Fecha en letras a ser interpretada por el reporte de servicios de
	 *         liquidaci�n
	 */
	public static String getFechaEnLetras(Calendar fecha) {
		int dia = fecha.get(Calendar.DAY_OF_MONTH);
		int anio = fecha.get(Calendar.YEAR);

		String fechaEnPalabras = dia + " de " + getMesEnLetras(fecha) + " de "
				+ anio;

		return fechaEnPalabras;

	}

	/**
	 * Retorna todos los meses del a�o
	 * 
	 * @return Mapa con todos los meses del a�o
	 */
	public static Map<Integer, String> getMesesDelAnio() {
		Map<Integer, String> mesesDelAnio = new LinkedHashMap<Integer, String>();
		mesesDelAnio.put(Calendar.JANUARY, "Enero");
		mesesDelAnio.put(Calendar.FEBRUARY, "Febrero");
		mesesDelAnio.put(Calendar.MARCH, "Marzo");
		mesesDelAnio.put(Calendar.APRIL, "Abril");
		mesesDelAnio.put(Calendar.MAY, "Mayo");
		mesesDelAnio.put(Calendar.JUNE, "Junio");
		mesesDelAnio.put(Calendar.JULY, "Julio");
		mesesDelAnio.put(Calendar.AUGUST, "Agosto");
		mesesDelAnio.put(Calendar.SEPTEMBER, "Septiembre");
		mesesDelAnio.put(Calendar.OCTOBER, "Octubre");
		mesesDelAnio.put(Calendar.NOVEMBER, "Noviembre");
		mesesDelAnio.put(Calendar.DECEMBER, "Diciembre");

		return mesesDelAnio;
	}

	/**
	 * Determina si el valor recibido por par�metro es un integer o no
	 * 
	 * @param valor
	 *            Valor a verificar si es entero
	 * @return true si es entero, false de lo contrario
	 */
	public static boolean isInteger(String valor) {
		try {
			Integer.parseInt(valor);
			return true;
		} catch (Exception e) {
			return false;
		}
	}

	/**
	 * Retorna la fecha en dd/mm/2010
	 * 
	 * @param fecha
	 *            Fecha yyyy-mm-dd
	 * @return
	 */
	public static String getFechaFormateada(String fecha) {
		if (StringUtils.isNullOrBlank(fecha)) {
			return "---";
		} else {
			String[] fechaArray = fecha.split("-");
			return fechaArray[2] + "/" + fechaArray[1] + "/" + fechaArray[0];
		}
	}
}
